home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / cocktail / cg.lha / cg / src / Order.mi < prev    next >
Text File  |  1992-11-24  |  50KB  |  2,108 lines

  1. IMPLEMENTATION MODULE Order;
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  
  11.  
  12.  
  13.  
  14.  
  15. IMPORT SYSTEM, System, IO, Tree;
  16. (* line 11 "" *)
  17.  
  18.  
  19. FROM SYSTEM    IMPORT TSIZE, ADR;
  20. FROM Memory    IMPORT Alloc, Free;
  21. FROM DynArray    IMPORT MakeArray;
  22. FROM IO        IMPORT StdOutput, WriteI, WriteS, WriteNl;
  23. FROM Idents    IMPORT WriteIdent;
  24.  
  25. FROM Sets    IMPORT
  26.    tSet        , MakeSet    , ReleaseSet    , IsElement    ,
  27.    Extract    , AssignEmpty    , Minimum    , Maximum    ,
  28.    Include    , Exclude    , Union        ;
  29.  
  30. FROM Relations    IMPORT
  31.    tRelation    , MakeRelation    , ReleaseRelation, Closure    ,
  32.    HasReflexive    , IsRelated    , Assign    , Difference    ,
  33.    IsCyclic    , GetCyclics    , WriteRelation    ;
  34.  
  35. FROM Queue    IMPORT
  36.    MakeQueue    , ReleaseQueue    , IsEmpty    , Enqueue    , Dequeue    ;
  37.  
  38. FROM Tree    IMPORT
  39.    NoTree    , tTree        , tInstance    , Referenced    ,
  40.    Computed    , Reverse    , Write        , Read        ,
  41.    Inherited    , Synthesized    , Input        , Output    ,
  42.    Stack    , Variable    ,
  43.    CopyDef    , CopyUse    , Thread    , Test        ,
  44.    Left        , Right        , Def        , Use        ,
  45.    ChildUse    , ParentUse    , NonBaseComp    , First        ,
  46.    Dummy    , Demand    , f        , WriteName    ,
  47.    WriteInstance, WriteDependencies, WriteClassProperties, WriteCyclics,
  48.    WriteClass    , MaxVisit    , MaxSet    ,
  49.    GrammarClass    , cLNC    , cDNC    , cLAG    , cOAG    , cSAG    , cSNC    , cWAG,
  50.    Options    , ForallClasses    , ForallAttributes, tSetOfRel    ,
  51.    tSetOfRelPtr    ;
  52.  
  53. FROM Optimize    IMPORT LifeTime1, LifeTime3,
  54.             ChildrenIn, ChildrenDyn, AttributeIn, AttributeOut, AttributeTree,
  55.             AttributeParam, AttributeVar, AttributeDemand, AttributeStack;
  56.  
  57. IMPORT Sets, Relations, Queue, Errors;
  58.  
  59. CONST
  60. GrammarIsInNormalForm    = 50    ;
  61. GrammarIsNotInNormalForm    = 51    ;
  62. SwitchedOnOptionL    = 52    ;
  63. GrammarIsSAG    = 53    ;
  64. GrammarIsLAG    = 54    ;
  65. GrammarIsOAG    = 55    ;
  66. GrammarIsDNC    = 56    ;
  67. GrammarIsSNC    = 57    ;
  68. GrammarIsWAG    = 58    ;
  69. GrammarIsNotWAG    = 59    ;
  70. CycleInSNC    = 60    ;
  71. CycleInDNC    = 61    ;
  72. CycleInOAG    = 62    ;
  73. InternalErrorCompOAG    = 63    ;
  74. CycleInWAG    = 64    ;
  75.  
  76. VAR
  77.    HasCycle    ,
  78.    Children    ,
  79.    Parents    ,
  80.    Relevant    ,
  81.    Cyclics    ,
  82.    IsComputed    ,
  83.    IsComputable    : tSet;
  84.    Prio        ,
  85.    UserIndex    ,
  86.    ClassCount    ,
  87.    Kind        ,
  88.    i, i2, j, k, n, Visit    : SHORTCARD;
  89.    Reporting    ,
  90.    Success    ,
  91.    Stable    : BOOLEAN;
  92.    ActClass    ,
  93.    UserClass    ,
  94.    ChildsClass    : tTree;
  95.    AttrInstance    : tInstance;
  96.    IndexSize    : LONGINT;
  97.  
  98. (*
  99. PROCEDURE OptimizeVisits (t: tTree): BOOLEAN;
  100.    VAR Success    : BOOLEAN;
  101.    BEGIN
  102.       CASE t^.Kind OF
  103.       | Tree.Class    :
  104.      WITH t^.Class DO
  105.         Success := FALSE;
  106.         IF OptimizeVisits (Extensions) THEN
  107.            n := InstCount;
  108.            LOOP
  109.           WITH Instance^ [Instance^ [n].Order] DO
  110.              IF (Input IN Properties) OR ({Synthesized, Left, Dummy} <= Properties) THEN
  111.              ELSE EXIT;
  112.              END;
  113.           END;
  114.           DEC (n);
  115.           IF n = 0 THEN EXIT; END;
  116.            END;
  117.            Success := TRUE;
  118.            LOOP
  119.           WITH Instance^ [Instance^ [n].Order] DO
  120.              IF (Left IN Properties) AND (Attribute^.Child.Partition > 0) AND
  121.             (Attribute^.Child.Partition = Visits - 1) THEN
  122.             EXIT;
  123.              END;
  124.              IF {Synthesized, Right} * Properties # {} THEN
  125.             Success := FALSE; EXIT;
  126.              END;
  127.           END;
  128.           DEC (n);
  129.           IF n = 0 THEN EXIT; END;
  130.            END;
  131.            IF Success THEN DEC (Visits);
  132.            END;
  133.         END;
  134.         RETURN OptimizeVisits (Next) AND Success;
  135.      END;
  136.       | Tree.NoClass    :
  137.      RETURN TRUE;
  138.       END;
  139.    END OptimizeVisits;
  140. *)
  141.  
  142. PROCEDURE IsComputable3a (i: SHORTCARD; t: tTree): BOOLEAN;
  143.    VAR j    : SHORTCARD;
  144.    BEGIN
  145.       WITH t^.Class DO
  146.      FOR j := 1 TO InstCount DO
  147.         IF IsRelated (i, j, OAG) AND NOT IsElement (j, IsComputed) THEN
  148.            RETURN FALSE;
  149.         END;
  150.      END;
  151.      RETURN TRUE;
  152.       END;
  153.    END IsComputable3a;
  154.  
  155. PROCEDURE IsComputable3b (i: SHORTCARD; t: tTree): BOOLEAN;
  156.    VAR j    : SHORTCARD;
  157.    BEGIN
  158.       WITH t^.Class DO
  159.      IF ({Synthesized, Right} <= Instance^[i].Properties) OR
  160.         ({Inherited, Left} <= Instance^[i].Properties) THEN
  161.         FOR j := 1 TO InstCount DO
  162.            IF (First IN Instance^ [j].Properties) AND IsRelated (j, i, OAG) AND
  163.           NOT IsElement (j, IsComputed) THEN
  164.           RETURN FALSE;
  165.            END;
  166.         END;
  167.      ELSE
  168.         FOR j := 1 TO InstCount DO
  169.            IF IsRelated (j, i, OAG) AND NOT IsElement (j, IsComputed) THEN
  170.           RETURN FALSE;
  171.            END;
  172.         END;
  173.      END;
  174.      RETURN TRUE;
  175.       END;
  176.    END IsComputable3b;
  177.  
  178.  
  179.  
  180.  
  181.  
  182.  
  183.  
  184.  
  185.  
  186.  
  187.  
  188.  
  189.  
  190.  
  191.  
  192.  
  193.  
  194.  
  195.  
  196.  
  197.  
  198.  
  199.  
  200.  
  201.  
  202.  
  203.  
  204.  
  205.  
  206.  
  207.  
  208.  
  209.  
  210.  
  211.  
  212.  
  213.  
  214.  
  215.  
  216.  
  217.  
  218.  
  219.  
  220.  
  221.  
  222.  
  223.  
  224.  
  225.  
  226.  
  227.  
  228.  
  229.  
  230.  
  231.  
  232.  
  233.  
  234.  
  235.  
  236.  
  237.  
  238.  
  239.  
  240.  
  241.  
  242.  
  243.  
  244.  
  245.  
  246.  
  247.  
  248.  
  249.  
  250.  
  251.  
  252.  
  253.  
  254.  
  255.  
  256.  
  257.  
  258.  
  259.  
  260.  
  261.  
  262.  
  263.  
  264.  
  265.  
  266.  
  267.  
  268.  
  269.  
  270.  
  271.  
  272.  
  273.  
  274.  
  275.  
  276.  
  277.  
  278.  
  279.  
  280.  
  281.  
  282.  
  283. PROCEDURE yyAbort (yyFunction: ARRAY OF CHAR);
  284.  BEGIN
  285.   IO.WriteS (IO.StdError, 'Error: module Order, routine ');
  286.   IO.WriteS (IO.StdError, yyFunction);
  287.   IO.WriteS (IO.StdError, ' failed');
  288.   IO.WriteNl (IO.StdError);
  289.   Exit;
  290.  END yyAbort;
  291.  
  292. PROCEDURE yyIsEqual (yya, yyb: ARRAY OF SYSTEM.BYTE): BOOLEAN;
  293.  VAR yyi    : INTEGER;
  294.  BEGIN
  295.   FOR yyi := 0 TO INTEGER (HIGH (yya)) DO
  296.    IF yya [yyi] # yyb [yyi] THEN RETURN FALSE; END;
  297.   END;
  298.   RETURN TRUE;
  299.  END yyIsEqual;
  300.  
  301. PROCEDURE Order (t: Tree.tTree);
  302.  VAR yyTempo: RECORD CASE : INTEGER OF
  303.  END; END;
  304.  BEGIN
  305.   IF t = Tree.NoTree THEN RETURN; END;
  306.   IF (t^.Kind = Tree.Ag) THEN
  307. (* line 175 "" *)
  308.      WITH t^.Ag DO
  309. (* line 175 "" *)
  310.       
  311.     Order (Classes);
  312. ;
  313.       RETURN;
  314.      END;
  315.  
  316.   END;
  317.   IF (t^.Kind = Tree.Class) THEN
  318. (* line 178 "" *)
  319.      WITH t^.Class DO
  320. (* line 178 "" *)
  321.       
  322.     Success := TRUE;
  323.     ForallClasses (t, CheckNormalForm);    (* normal form?        *)
  324.     IF Success THEN
  325. Tree.Information (GrammarIsInNormalForm, t^.Class.Pos);
  326.     ELSE
  327. Tree.Information (GrammarIsNotInNormalForm, t^.Class.Pos);
  328.     END;
  329.  
  330.     IF cLNC IN GrammarClass THEN
  331.  
  332.     ForallClasses (t, CompIndex);    (* absolutely non circular?    *)
  333.     IndexSize := ClassCount + 1;
  334.     MakeArray (IndexToClass, IndexSize, TSIZE (tTree));
  335.     MakeQueue (ClassCount);
  336.     MakeSet (HasCycle, ClassCount);
  337.     ForallClasses (t, CompIndexToClass);
  338.     ForallClasses (t, CompUsers);
  339.  
  340.     WHILE NOT IsEmpty () DO
  341.        ActClass := IndexToClass^[Dequeue ()];
  342.        Closure (ActClass^.Class.SNC);
  343.        CompSNC1 (ActClass^.Class.BaseClass);
  344.        FOR UserIndex := Minimum (ActClass^.Class.Users) TO Maximum (ActClass^.Class.Users) DO
  345.           IF IsElement (UserIndex, ActClass^.Class.Users) THEN
  346.          UserClass := IndexToClass^[UserIndex];
  347.          ForallAttributes (UserClass, CompSNC1);
  348.           END;
  349.        END;
  350.     END;
  351.  
  352.     ForallClasses (t, CompSNC2);
  353.     IF Sets.IsEmpty (HasCycle) THEN INCL (GrammarClass, cSNC);
  354.     ELSIF NOT IsElement (ORD ('L'), Options) THEN
  355. Tree.Information (SwitchedOnOptionL, t^.Class.Pos);
  356.        Include (Options, ORD ('L'));
  357.     END;
  358.  
  359.     IF cSNC IN GrammarClass THEN
  360.  
  361.     WHILE NOT IsEmpty () DO        (* double closure non circular?    *)
  362.        ActClass := IndexToClass^[Dequeue ()];
  363.        Closure (ActClass^.Class.DNC);
  364.        ForallClasses (ActClass^.Class.Extensions, CompDNC1);
  365.        ForallAttributes (ActClass, CompDNC1);
  366.     END;
  367.  
  368.     ReleaseQueue;
  369.     Success := TRUE;
  370.     ForallClasses (t, CompDNC2);
  371.     IF Success THEN INCL (GrammarClass, cDNC);
  372.     ELSIF NOT IsElement (ORD ('L'), Options) THEN
  373. Tree.Information (SwitchedOnOptionL, t^.Class.Pos);
  374.        Include (Options, ORD ('L'));
  375.     END;
  376.  
  377.     IF cDNC IN GrammarClass THEN
  378.                         (* compute partitions: numbers    *)
  379.       IF IsElement (ORD ('/'), Options) THEN
  380.     ForallClasses (t, CompOAG0a);        (* as early as possible        *)
  381.       ELSE
  382.     ForallClasses (t, CompOAG0b);        (* as late as possible        *)
  383.     ForallClasses (t, CompOAG0c);
  384.     ForallClasses (t, CompOAG0d);
  385.       END;
  386.     ForallClasses (t, CompOAG1);        (* compute partitions: dependencies *)
  387.     Success := TRUE;
  388.     ForallClasses (t, CompOAG2);        (* ordered ?            *)
  389.     IF Success THEN INCL (GrammarClass, cOAG);
  390.     ELSIF NOT IsElement (ORD ('L'), Options) THEN
  391. Tree.Information (SwitchedOnOptionL, t^.Class.Pos);
  392.        Include (Options, ORD ('L'));
  393.     END;
  394.  
  395.     IF (cOAG IN GrammarClass) THEN
  396.       IF NOT IsElement (ORD ('L'), Options) THEN
  397.                         (* visit sequences        *)
  398.       IF IsElement (ORD ('/'), Options) THEN
  399.     ForallClasses (t, CompOAG3a);        (* as early as possible        *)
  400.       ELSE
  401.     ForallClasses (t, CompOAG3b);        (* as late as possible        *)
  402.       END;
  403. (*    Success := OptimizeVisits (t); *)    (* optimize sequences        *)
  404.       IF IsElement (ORD ('0'), Options) THEN
  405.     ForallClasses (t, LifeTime1);
  406. (*    MakeSet (Children, ClassCount);
  407.     MakeSet (Parents , ClassCount);
  408.     MakeSet (Relevant, ClassCount);
  409.     ForallClasses (t, LifeTime4);
  410.     ReleaseSet (Children);
  411.     ReleaseSet (Parents );
  412.     ReleaseSet (Relevant); *)
  413.       IF IsElement (ORD ('3'), Options) THEN
  414.     WriteNl (StdOutput);
  415.     WriteS (StdOutput, "Attribute Storage Assignment"); WriteNl (StdOutput);
  416.     WriteS (StdOutput, "----------------------------"); WriteNl (StdOutput);
  417.     WriteNl (StdOutput);
  418.     ChildrenDyn    := 0;
  419.     ChildrenIn    := 0;
  420.     AttributeIn    := 0;
  421.     AttributeOut    := 0;
  422.     AttributeTree    := 0;
  423.     AttributeParam    := 0;
  424.     AttributeVar    := 0;
  425.     AttributeDemand    := 0;
  426.     AttributeStack    := 0;
  427.       END;
  428.     ForallClasses (t, LifeTime3);
  429.       IF IsElement (ORD ('3'), Options) THEN
  430.     WriteNl (StdOutput);
  431.     IF ChildrenIn > 0 THEN
  432.        WriteS (StdOutput, "Children  Input        ");
  433.        WriteI (StdOutput, ChildrenIn, 3); WriteNl (StdOutput);
  434.     END;
  435.     IF ChildrenDyn > 0 THEN
  436.        WriteS (StdOutput, "Children  Dynamic    ");
  437.        WriteI (StdOutput, ChildrenDyn, 3); WriteNl (StdOutput);
  438.     END;
  439.     IF AttributeIn > 0 THEN
  440.        WriteS (StdOutput, "Attribute Input        ");
  441.        WriteI (StdOutput, AttributeIn, 3); WriteNl (StdOutput);
  442.     END;
  443.     IF AttributeOut > 0 THEN
  444.        WriteS (StdOutput, "Attribute Output    ");
  445.        WriteI (StdOutput, AttributeOut, 3); WriteNl (StdOutput);
  446.     END;
  447.     IF AttributeTree > 0 THEN
  448.        WriteS (StdOutput, "Attribute Tree        ");
  449.        WriteI (StdOutput, AttributeTree, 3); WriteNl (StdOutput);
  450.     END;
  451.     IF AttributeParam > 0 THEN
  452.        WriteS (StdOutput, "Attribute Parameter    ");
  453.        WriteI (StdOutput, AttributeParam, 3); WriteNl (StdOutput);
  454.     END;
  455.     IF AttributeVar > 0 THEN
  456.        WriteS (StdOutput, "Attribute Variable    ");
  457.        WriteI (StdOutput, AttributeVar, 3); WriteNl (StdOutput);
  458.     END;
  459.     IF AttributeDemand > 0 THEN
  460.        WriteS (StdOutput, "Attribute Demand    ");
  461.        WriteI (StdOutput, AttributeDemand    , 3); WriteNl (StdOutput);
  462.     END;
  463.     IF AttributeStack > 0 THEN
  464.        WriteS (StdOutput, "Attribute Stack    ");
  465.        WriteI (StdOutput, AttributeStack    , 3); WriteNl (StdOutput);
  466.     END;
  467.       END;
  468.       END;
  469.       END;
  470.  
  471.     Success := TRUE;
  472.     ForallClasses (t, CheckLAG);        (* LAG?            *)
  473.     IF Success THEN INCL (GrammarClass, cLAG); END;
  474.  
  475.     IF cLAG IN GrammarClass THEN
  476.  
  477.     Success := TRUE;
  478.     ForallClasses (t, CheckSAG);        (* SAG?            *)
  479.     IF Success THEN INCL (GrammarClass, cSAG); END;
  480.  
  481.     IF cSAG IN GrammarClass THEN
  482. Tree.Information (GrammarIsSAG, t^.Class.Pos);
  483.     ELSE
  484. Tree.Information (GrammarIsLAG, t^.Class.Pos);
  485.     END; ELSE
  486. Tree.Information (GrammarIsOAG, t^.Class.Pos);
  487.     END; ELSE
  488. Tree.Information (GrammarIsDNC, t^.Class.Pos);
  489.     END; ELSE 
  490. Tree.Information (GrammarIsSNC, t^.Class.Pos);
  491.     END; ELSE 
  492.  
  493.     ReleaseQueue;                (* WAG?            *)
  494.     MakeQueue (ClassCount);
  495.     MakeSet (Relevant, ClassCount);
  496.     MakeSet (Cyclics, ClassCount);
  497.     Sets.Assign (Cyclics, HasCycle);
  498.     WHILE NOT Sets.IsEmpty (Cyclics) DO
  499.        InitWAG (IndexToClass^[Extract (Cyclics)]);
  500.     END;
  501.     Reporting := FALSE;
  502.     WHILE NOT Sets.IsEmpty (HasCycle) DO
  503.        CheckWAG0 (IndexToClass^[Extract (HasCycle)]);
  504.     END;
  505.     ReleaseSet (Cyclics);
  506.  
  507.     WHILE NOT IsEmpty () DO
  508.        CheckWAG2 (IndexToClass^[Dequeue ()]);
  509.     END;
  510.  
  511.     IF Sets.IsEmpty (HasCycle) THEN INCL (GrammarClass, cWAG);
  512. Tree.Information (GrammarIsWAG, t^.Class.Pos);
  513.     ELSE
  514.        Reporting := TRUE;
  515.        WHILE NOT Sets.IsEmpty (HasCycle) DO
  516.           CheckWAG2 (IndexToClass^[Extract (HasCycle)]);
  517.        END;
  518. Tree.Information (GrammarIsNotWAG, t^.Class.Pos);
  519.     END;
  520.     ReleaseSet (HasCycle);
  521.     ReleaseQueue;
  522.  
  523.     END; ELSE 
  524. Tree.Information (GrammarIsNotWAG, t^.Class.Pos);
  525.     END;
  526. ;
  527.       RETURN;
  528.      END;
  529.  
  530.   END;
  531.  END Order;
  532.  
  533. PROCEDURE CompIndex (t: Tree.tTree);
  534.  VAR yyTempo: RECORD CASE : INTEGER OF
  535.  END; END;
  536.  BEGIN
  537.   IF t = Tree.NoTree THEN RETURN; END;
  538.   IF (t^.Kind = Tree.Class) THEN
  539. (* line 388 "" *)
  540.      WITH t^.Class DO
  541. (* line 388 "" *)
  542.       
  543.     INC (ClassCount);
  544.     Index := ClassCount;
  545.     MakeRelation (SNC, InstCount, InstCount);
  546.     Assign (SNC, DP);
  547. ;
  548.       RETURN;
  549.      END;
  550.  
  551.   END;
  552.  END CompIndex;
  553.  
  554. PROCEDURE CompIndexToClass (t: Tree.tTree);
  555.  VAR yyTempo: RECORD CASE : INTEGER OF
  556.  END; END;
  557.  BEGIN
  558.   IF t = Tree.NoTree THEN RETURN; END;
  559.   IF (t^.Kind = Tree.Class) THEN
  560. (* line 398 "" *)
  561.      WITH t^.Class DO
  562. (* line 398 "" *)
  563.       
  564.     IndexToClass^ [Index] := t;
  565.     MakeSet (Users, ClassCount);
  566.     Enqueue (Index);
  567. ;
  568.       RETURN;
  569.      END;
  570.  
  571.   END;
  572.  END CompIndexToClass;
  573.  
  574. PROCEDURE CompUsers (t: Tree.tTree);
  575.  VAR yyTempo: RECORD CASE : INTEGER OF
  576.  END; END;
  577.  BEGIN
  578.   IF t = Tree.NoTree THEN RETURN; END;
  579.   IF (t^.Kind = Tree.Class) THEN
  580. (* line 407 "" *)
  581.      WITH t^.Class DO
  582. (* line 407 "" *)
  583.       
  584.     ActClass := t;
  585.     ForallAttributes (t, CompUsers);
  586. ;
  587.       RETURN;
  588.      END;
  589.  
  590.   END;
  591.   IF (t^.Kind = Tree.Child) THEN
  592. (* line 411 "" *)
  593.      WITH t^.Child DO
  594. (* line 411 "" *)
  595.       
  596.     ChildsClass := Class;
  597.     IF ChildsClass # NoTree THEN
  598.        Include (ChildsClass^.Class.Users, ActClass^.Class.Index);
  599.     END;
  600. ;
  601.       RETURN;
  602.      END;
  603.  
  604.   END;
  605.  END CompUsers;
  606.  
  607. PROCEDURE CompSNC1 (t: Tree.tTree);
  608.  VAR yyTempo: RECORD CASE : INTEGER OF
  609.  END; END;
  610.  BEGIN
  611.   IF t = Tree.NoTree THEN RETURN; END;
  612.   IF (t^.Kind = Tree.Class) THEN
  613. (* line 421 "" *)
  614.      WITH t^.Class DO
  615. (* line 421 "" *)
  616.       
  617.     FOR i := 1 TO AttrCount DO
  618.        FOR j := 1 TO AttrCount DO
  619.           IF IsRelated (i, j, ActClass^.Class.SNC) THEN
  620.          IF NOT IsRelated (i, j, SNC) THEN
  621.             Relations.Include (SNC, i, j);
  622.             Enqueue (Index);
  623.          END;
  624.           END;
  625.        END;
  626.     END;
  627. ;
  628.       RETURN;
  629.      END;
  630.  
  631.   END;
  632.   IF (t^.Kind = Tree.Child) THEN
  633. (* line 433 "" *)
  634.    LOOP
  635.      WITH t^.Child DO
  636. (* line 434 "" *)
  637.       IF NOT (Class # NoTree) THEN EXIT; END;
  638. (* line 435 "" *)
  639.       ChildsClass := Class;
  640. (* line 436 "" *)
  641.       IF NOT ((ChildsClass = ActClass) OR Queue . IsElement (ChildsClass ^ . Class . Index)) THEN EXIT; END;
  642. (* line 437 "" *)
  643.           FOR i := 1 TO ChildsClass^.Class.AttrCount DO
  644.        FOR j := 1 TO ChildsClass^.Class.AttrCount DO
  645.           IF IsRelated (i, j, ChildsClass^.Class.SNC) THEN
  646.          IF NOT IsRelated (UserClass^.Class.AttrCount + InstOffset + i, UserClass^.Class.AttrCount + InstOffset + j, UserClass^.Class.SNC) THEN
  647.             Relations.Include (UserClass^.Class.SNC, UserClass^.Class.AttrCount + InstOffset + i, UserClass^.Class.AttrCount + InstOffset + j);
  648.             Enqueue (UserClass^.Class.Index);
  649.          END;
  650.           END;
  651.        END;
  652.     END;
  653. ;
  654.       RETURN;
  655.      END;
  656.    END;
  657.  
  658.   END;
  659.  END CompSNC1;
  660.  
  661. PROCEDURE CompSNC2 (t: Tree.tTree);
  662.  VAR yyTempo: RECORD CASE : INTEGER OF
  663.  END; END;
  664.  BEGIN
  665.   IF t = Tree.NoTree THEN RETURN; END;
  666.   IF (t^.Kind = Tree.Class) THEN
  667. (* line 452 "" *)
  668.      WITH t^.Class DO
  669. (* line 452 "" *)
  670.       
  671.     IF HasReflexive (SNC) THEN
  672.       IF NOT IsElement (ORD ('L'), Options) THEN
  673. Tree.WarningI (CycleInSNC, t^.Class.Pos, Errors.Ident, ADR (Name));
  674.        WriteS (StdOutput, "Attribute Dependencies SNC");
  675.        WriteNl (StdOutput); WriteNl (StdOutput);
  676.        WriteDependencies (t, SNC, MaxSet);
  677.        WriteS (StdOutput, "Cyclic Attributes");
  678.        WriteNl (StdOutput); WriteNl (StdOutput);
  679.        MakeSet (Cyclics, InstCount);
  680.        GetCyclics (SNC, Cyclics);
  681.        WriteCyclics (t, Cyclics); WriteNl (StdOutput);
  682.        ReleaseSet (Cyclics);
  683.       END;
  684.        Include (HasCycle, Index);
  685.     END;
  686.       IF IsElement (ORD ('S'), Options) THEN
  687.     WriteDependencies (t, SNC, MaxSet);
  688.       END;
  689.     MakeRelation (DNC, InstCount, InstCount);
  690.     Assign (DNC, SNC);
  691.     Enqueue (Index);
  692. ;
  693.       RETURN;
  694.      END;
  695.  
  696.   END;
  697.  END CompSNC2;
  698.  
  699. PROCEDURE CompDNC1 (t: Tree.tTree);
  700.  VAR yyTempo: RECORD CASE : INTEGER OF
  701.  END; END;
  702.  BEGIN
  703.   IF t = Tree.NoTree THEN RETURN; END;
  704.   IF (t^.Kind = Tree.Class) THEN
  705. (* line 479 "" *)
  706.      WITH t^.Class DO
  707. (* line 479 "" *)
  708.       
  709.     FOR i := 1 TO ActClass^.Class.AttrCount DO
  710.        FOR j := 1 TO ActClass^.Class.AttrCount DO
  711.           IF IsRelated (i, j, ActClass^.Class.DNC) THEN
  712.          IF NOT IsRelated (i, j, DNC) THEN
  713.             Relations.Include (DNC, i, j);
  714.             Enqueue (Index);
  715.          END;
  716.           END;
  717.        END;
  718.     END;
  719. ;
  720.       RETURN;
  721.      END;
  722.  
  723.   END;
  724.   IF (t^.Kind = Tree.Child) THEN
  725. (* line 491 "" *)
  726.    LOOP
  727.      WITH t^.Child DO
  728. (* line 492 "" *)
  729.       IF NOT (Class # NoTree) THEN EXIT; END;
  730. (* line 493 "" *)
  731.       ChildsClass := Class;
  732. (* line 494 "" *)
  733.           FOR i := 1 TO ChildsClass^.Class.AttrCount DO
  734.        FOR j := 1 TO ChildsClass^.Class.AttrCount DO
  735.           IF IsRelated (ActClass^.Class.AttrCount + InstOffset + i, ActClass^.Class.AttrCount + InstOffset + j, ActClass^.Class.DNC) THEN
  736.          IF NOT IsRelated (i, j, ChildsClass^.Class.DNC) THEN
  737.             Relations.Include (ChildsClass^.Class.DNC, i, j);
  738.             Enqueue (ChildsClass^.Class.Index);
  739.          END;
  740.           END;
  741.        END;
  742.     END;
  743. ;
  744.       RETURN;
  745.      END;
  746.    END;
  747.  
  748.   END;
  749.  END CompDNC1;
  750.  
  751. PROCEDURE CompDNC2 (t: Tree.tTree);
  752.  VAR yyTempo: RECORD CASE : INTEGER OF
  753.  END; END;
  754.  BEGIN
  755.   IF t = Tree.NoTree THEN RETURN; END;
  756.   IF (t^.Kind = Tree.Class) THEN
  757. (* line 509 "" *)
  758.      WITH t^.Class DO
  759. (* line 509 "" *)
  760.       
  761.     IF HasReflexive (DNC) THEN
  762.       IF NOT IsElement (ORD ('L'), Options) THEN
  763. Tree.WarningI (CycleInDNC, t^.Class.Pos, Errors.Ident, ADR (Name));
  764.        WriteS (StdOutput, "Attribute Dependencies DNC");
  765.        WriteNl (StdOutput); WriteNl (StdOutput);
  766.        WriteDependencies (t, DNC, MaxSet);
  767.        WriteS (StdOutput, "Cyclic Attributes");
  768.        WriteNl (StdOutput); WriteNl (StdOutput);
  769.        MakeSet (Cyclics, InstCount);
  770.        GetCyclics (DNC, Cyclics);
  771.        WriteCyclics (t, Cyclics); WriteNl (StdOutput);
  772.        ReleaseSet (Cyclics);
  773.       END;
  774.        Success := FALSE;
  775.     END;
  776.       IF IsElement (ORD ('N'), Options) THEN
  777.     WriteDependencies (t, DNC, MaxSet);
  778.       END;
  779.     MakeRelation (OAG, InstCount, InstCount);
  780.     Assign (OAG, DNC);
  781. ;
  782.       RETURN;
  783.      END;
  784.  
  785.   END;
  786.  END CompDNC2;
  787.  
  788. PROCEDURE CompOAG0a (t: Tree.tTree);
  789.  VAR yyTempo: RECORD CASE : INTEGER OF
  790.  END; END;
  791.  BEGIN
  792.   IF t = Tree.NoTree THEN RETURN; END;
  793.   IF (t^.Kind = Tree.Class) THEN
  794. (* line 535 "" *)
  795.      WITH t^.Class DO
  796. (* line 535 "" *)
  797.       
  798.     ActClass := t;
  799.     IF BaseClass^.Kind = Tree.Class THEN
  800.        n := BaseClass^.Class.AttrCount;    (* compute partition for
  801.                            additional attributes only *)
  802.     ELSE
  803.        n := 0;
  804.     END;
  805.     k := 0;
  806.  
  807.     REPEAT
  808.        INC (k);
  809.        REPEAT
  810.           Stable := TRUE;
  811.           Kind := Inherited;
  812.           ForallAttributes (Attributes, CompOAG0a);
  813.        UNTIL Stable;
  814.        REPEAT
  815.           Stable := TRUE;
  816.           Kind := Synthesized;
  817.           ForallAttributes (Attributes, CompOAG0a);
  818.        UNTIL Stable;
  819.     UNTIL n = AttrCount;
  820.  
  821.     IF (BaseClass^.Kind = Tree.Class) AND (BaseClass^.Class.Visits > k) THEN
  822.        k := BaseClass^.Class.Visits;
  823.     END;
  824.     Visits := k;
  825.     IF MaxVisit < k THEN MaxVisit := k; END;
  826. ;
  827.       RETURN;
  828.      END;
  829.  
  830.   END;
  831.   IF (t^.Kind = Tree.Child) THEN
  832. (* line 565 "" *)
  833.      WITH t^.Child DO
  834. (* line 565 "" *)
  835.       
  836.     IF Partition = 9999 THEN
  837.        IF (Input IN Properties) OR
  838.           ((Properties * {Inherited, Synthesized}) = {}) THEN
  839.           Partition := 0; INC (n); RETURN;
  840.        END;
  841.        IF Kind IN Properties THEN
  842.           FOR i := 1 TO ActClass^.Class.AttrCount DO
  843.          IF IsRelated (AttrIndex, i, ActClass^.Class.OAG) AND
  844.             (ActClass^.Class.Instance^[i].Attribute^.Child.Partition > k) THEN
  845.             RETURN;
  846.          END;
  847.           END;
  848.           Partition := k; INC (n); Stable := FALSE;
  849.        END;
  850.     END;
  851. ;
  852.       RETURN;
  853.      END;
  854.  
  855.   END;
  856.   IF (t^.Kind = Tree.Attribute) THEN
  857. (* line 582 "" *)
  858.      WITH t^.Attribute DO
  859. (* line 582 "" *)
  860.       
  861.     IF Partition = 9999 THEN
  862.        IF (Input IN Properties) OR
  863.           ((Properties * {Inherited, Synthesized}) = {}) THEN
  864.           Partition := 0; INC (n); RETURN;
  865.        END;
  866.        IF Kind IN Properties THEN
  867.           FOR i := 1 TO ActClass^.Class.AttrCount DO
  868.          IF IsRelated (AttrIndex, i, ActClass^.Class.OAG) AND
  869.             (ActClass^.Class.Instance^[i].Attribute^.Attribute.Partition > k) THEN
  870.             RETURN;
  871.          END;
  872.           END;
  873.           Partition := k; INC (n); Stable := FALSE;
  874.        END;
  875.     END;
  876. ;
  877.       RETURN;
  878.      END;
  879.  
  880.   END;
  881.  END CompOAG0a;
  882.  
  883. PROCEDURE CompOAG0b (t: Tree.tTree);
  884.  VAR yyTempo: RECORD CASE : INTEGER OF
  885.  END; END;
  886.  BEGIN
  887.   IF t = Tree.NoTree THEN RETURN; END;
  888.   IF (t^.Kind = Tree.Class) THEN
  889. (* line 603 "" *)
  890.      WITH t^.Class DO
  891. (* line 603 "" *)
  892.       
  893.     ActClass := t;
  894.     IF BaseClass^.Kind = Tree.Class THEN
  895.        n := BaseClass^.Class.AttrCount;    (* compute partition for
  896.                            additional attributes only *)
  897.     ELSE
  898.        n := 0;
  899.     END;
  900.     k := 0;
  901.  
  902.     REPEAT
  903.        INC (k);
  904.        REPEAT
  905.           Kind := Synthesized;
  906.           Stable := TRUE;
  907.           ForallAttributes (Attributes, CompOAG0b);
  908.        UNTIL Stable;
  909.        REPEAT
  910.           Stable := TRUE;
  911.           Kind := Inherited;
  912.           ForallAttributes (Attributes, CompOAG0b);
  913.        UNTIL Stable;
  914.     UNTIL n = AttrCount;
  915.  
  916.     IF (BaseClass^.Kind = Tree.Class) AND (BaseClass^.Class.Visits > k) THEN
  917.        k := BaseClass^.Class.Visits;
  918.     END;
  919.     Visits := k;
  920.     IF MaxVisit < k THEN MaxVisit := k; END;
  921. ;
  922.       RETURN;
  923.      END;
  924.  
  925.   END;
  926.   IF (t^.Kind = Tree.Child) THEN
  927. (* line 633 "" *)
  928.      WITH t^.Child DO
  929. (* line 633 "" *)
  930.       
  931.     IF Partition = 9999 THEN
  932.        IF (Input IN Properties) OR
  933.           ((Properties * {Inherited, Synthesized}) = {}) THEN
  934.           Partition := 0; INC (n); RETURN;
  935.        END;
  936.        IF Kind IN Properties THEN
  937.           FOR i := 1 TO ActClass^.Class.AttrCount DO
  938.          IF IsRelated (i, AttrIndex, ActClass^.Class.OAG) AND
  939.             (ActClass^.Class.Instance^[i].Attribute^.Child.Partition > k) THEN
  940.             RETURN;
  941.          END;
  942.           END;
  943.           Partition := k; INC (n); Stable := FALSE;
  944.        END;
  945.     END;
  946. ;
  947.       RETURN;
  948.      END;
  949.  
  950.   END;
  951.   IF (t^.Kind = Tree.Attribute) THEN
  952. (* line 650 "" *)
  953.      WITH t^.Attribute DO
  954. (* line 650 "" *)
  955.       
  956.     IF Partition = 9999 THEN
  957.        IF (Input IN Properties) OR
  958.           ((Properties * {Inherited, Synthesized}) = {}) THEN
  959.           Partition := 0; INC (n); RETURN;
  960.        END;
  961.        IF Kind IN Properties THEN
  962.           FOR i := 1 TO ActClass^.Class.AttrCount DO
  963.          IF IsRelated (i, AttrIndex, ActClass^.Class.OAG) AND
  964.             (ActClass^.Class.Instance^[i].Attribute^.Attribute.Partition > k) THEN
  965.             RETURN;
  966.          END;
  967.           END;
  968.           Partition := k; INC (n); Stable := FALSE;
  969.        END;
  970.     END;
  971. ;
  972.       RETURN;
  973.      END;
  974.  
  975.   END;
  976.  END CompOAG0b;
  977.  
  978. PROCEDURE CompOAG0c (t: Tree.tTree);
  979.  VAR yyTempo: RECORD CASE : INTEGER OF
  980.  END; END;
  981.  BEGIN
  982.   IF t = Tree.NoTree THEN RETURN; END;
  983.   IF (t^.Kind = Tree.Class) THEN
  984. (* line 671 "" *)
  985.      WITH t^.Class DO
  986. (* line 671 "" *)
  987.       
  988.     k := Visits + 1;
  989.     ForallAttributes (Attributes, CompOAG0c);
  990. ;
  991.       RETURN;
  992.      END;
  993.  
  994.   END;
  995.   IF (t^.Kind = Tree.Child) THEN
  996. (* line 675 "" *)
  997.      WITH t^.Child DO
  998. (* line 675 "" *)
  999.       
  1000.     IF Partition # 0 THEN Partition := k - Partition; END;
  1001. ;
  1002.       RETURN;
  1003.      END;
  1004.  
  1005.   END;
  1006.   IF (t^.Kind = Tree.Attribute) THEN
  1007. (* line 678 "" *)
  1008.      WITH t^.Attribute DO
  1009. (* line 678 "" *)
  1010.       
  1011.     IF Partition # 0 THEN Partition := k - Partition; END;
  1012. ;
  1013.       RETURN;
  1014.      END;
  1015.  
  1016.   END;
  1017.  END CompOAG0c;
  1018.  
  1019. PROCEDURE CompOAG0d (t: Tree.tTree);
  1020.  VAR yyTempo: RECORD CASE : INTEGER OF
  1021.  END; END;
  1022.  BEGIN
  1023.   IF t = Tree.NoTree THEN RETURN; END;
  1024.   IF (t^.Kind = Tree.Class) THEN
  1025. (* line 685 "" *)
  1026.      WITH t^.Class DO
  1027. (* line 685 "" *)
  1028.       
  1029.     ActClass := t;
  1030.     k := 0;
  1031.     REPEAT
  1032.        INC (k);
  1033.        REPEAT
  1034.           Stable := TRUE;
  1035.           ForallAttributes (Attributes, CompOAG0d);
  1036.        UNTIL Stable;
  1037.        REPEAT
  1038.           Stable := TRUE;
  1039.           ForallAttributes (Attributes, CompOAG0e);
  1040.        UNTIL Stable;
  1041.     UNTIL k = Visits;
  1042. ;
  1043.       RETURN;
  1044.      END;
  1045.  
  1046.   END;
  1047.   IF (t^.Kind = Tree.Child) THEN
  1048. (* line 700 "" *)
  1049.      WITH t^.Child DO
  1050. (* line 700 "" *)
  1051.       
  1052.     IF (Partition > k) AND (Synthesized IN Properties) AND
  1053.        ((({Output, Test} * Properties) # {}) OR (({Read, Dummy} * Properties) = {})) THEN
  1054.        FOR i := 1 TO ActClass^.Class.AttrCount DO
  1055.           IF IsRelated (AttrIndex, i, ActClass^.Class.OAG) AND
  1056.          (ActClass^.Class.Instance^[i].Attribute^.Child.Partition > k) THEN
  1057.          RETURN;
  1058.           END;
  1059.        END;
  1060.  
  1061.        Partition := k; Stable := FALSE;
  1062.     END;
  1063. ;
  1064.       RETURN;
  1065.      END;
  1066.  
  1067.   END;
  1068.   IF (t^.Kind = Tree.Attribute) THEN
  1069. (* line 713 "" *)
  1070.      WITH t^.Attribute DO
  1071. (* line 713 "" *)
  1072.       
  1073.     IF (Partition > k) AND (Synthesized IN Properties) AND
  1074.        ((({Output, Test} * Properties) # {}) OR (({Read, Dummy} * Properties) = {})) THEN
  1075.        FOR i := 1 TO ActClass^.Class.AttrCount DO
  1076.           IF IsRelated (AttrIndex, i, ActClass^.Class.OAG) AND
  1077.          (ActClass^.Class.Instance^[i].Attribute^.Attribute.Partition > k) THEN
  1078.          RETURN;
  1079.           END;
  1080.        END;
  1081.  
  1082.        Partition := k; Stable := FALSE;
  1083.     END;
  1084. ;
  1085.       RETURN;
  1086.      END;
  1087.  
  1088.   END;
  1089.  END CompOAG0d;
  1090.  
  1091. PROCEDURE CompOAG0e (t: Tree.tTree);
  1092.  VAR yyTempo: RECORD CASE : INTEGER OF
  1093.  END; END;
  1094.  BEGIN
  1095.   IF t = Tree.NoTree THEN RETURN; END;
  1096.   IF (t^.Kind = Tree.Child) THEN
  1097. (* line 730 "" *)
  1098.      WITH t^.Child DO
  1099. (* line 730 "" *)
  1100.       
  1101.     IF (Partition > k) AND (Inherited IN Properties) AND
  1102.        ((({Output, Test} * Properties) # {}) OR (({Read, Dummy} * Properties) = {})) THEN
  1103.        FOR i := 1 TO ActClass^.Class.AttrCount DO
  1104.           WITH ActClass^.Class.Instance^[i] DO
  1105.          IF IsRelated (AttrIndex, i, ActClass^.Class.OAG) AND
  1106.            ((Inherited IN Properties) AND (Attribute^.Child.Partition > k) OR
  1107.             (Synthesized IN Properties) AND (Attribute^.Child.Partition >= k)) THEN
  1108.             RETURN;
  1109.          END;
  1110.           END;
  1111.        END;
  1112.  
  1113.        Partition := k; Stable := FALSE;
  1114.     END;
  1115. ;
  1116.       RETURN;
  1117.      END;
  1118.  
  1119.   END;
  1120.   IF (t^.Kind = Tree.Attribute) THEN
  1121. (* line 746 "" *)
  1122.      WITH t^.Attribute DO
  1123. (* line 746 "" *)
  1124.       
  1125.     IF (Partition > k) AND (Inherited IN Properties) AND
  1126.        ((({Output, Test} * Properties) # {}) OR (({Read, Dummy} * Properties) = {})) THEN
  1127.        FOR i := 1 TO ActClass^.Class.AttrCount DO
  1128.           WITH ActClass^.Class.Instance^[i] DO
  1129.          IF IsRelated (AttrIndex, i, ActClass^.Class.OAG) AND
  1130.            ((Inherited IN Properties) AND (Attribute^.Attribute.Partition > k) OR
  1131.             (Synthesized IN Properties) AND (Attribute^.Attribute.Partition >= k)) THEN
  1132.             RETURN;
  1133.          END;
  1134.           END;
  1135.        END;
  1136.  
  1137.        Partition := k; Stable := FALSE;
  1138.     END;
  1139. ;
  1140.       RETURN;
  1141.      END;
  1142.  
  1143.   END;
  1144.  END CompOAG0e;
  1145.  
  1146. PROCEDURE CompOAG1 (t: Tree.tTree);
  1147.  VAR yyTempo: RECORD CASE : INTEGER OF
  1148.  END; END;
  1149.  BEGIN
  1150.   IF t = Tree.NoTree THEN RETURN; END;
  1151.   IF (t^.Kind = Tree.Class) THEN
  1152. (* line 766 "" *)
  1153.      WITH t^.Class DO
  1154. (* line 766 "" *)
  1155.       
  1156.     FOR i := 1 TO AttrCount DO
  1157.        WITH Instance^[i] DO
  1158.           IF Synthesized IN Properties THEN
  1159.          FOR j := 1 TO AttrCount DO
  1160.             IF (Inherited IN Instance^[j].Properties) AND
  1161.                (Attribute^.Child.Partition = Instance^[j].Attribute^.Child.Partition) THEN
  1162.                Relations.Include (OAG, i, j);
  1163.             END;
  1164.          END;
  1165.           END;
  1166.        END;
  1167.     END;
  1168.  
  1169.     FOR i := 1 TO AttrCount DO
  1170.        WITH Instance^[i] DO
  1171.           IF (Inherited IN Properties) AND (Attribute^.Child.Partition >= 2) THEN
  1172.          FOR j := 1 TO AttrCount DO
  1173.             IF (Synthesized IN Instance^[j].Properties) AND
  1174.                (Attribute^.Child.Partition - 1 = Instance^[j].Attribute^.Child.Partition) THEN
  1175.                Relations.Include (OAG, i, j);
  1176.             END;
  1177.          END;
  1178.           END;
  1179.        END;
  1180.     END;
  1181.  
  1182.       IF IsElement (ORD ('C'), Options) THEN
  1183.     MakeRelation (Part, InstCount, InstCount);
  1184.     Assign (Part, OAG);
  1185.     Difference (Part, DNC);
  1186.     WriteDependencies (t, Part, MaxSet); WriteNl (StdOutput);
  1187.     ReleaseRelation (Part);
  1188.       END;
  1189. ;
  1190.       RETURN;
  1191.      END;
  1192.  
  1193.   END;
  1194.  END CompOAG1;
  1195.  
  1196. PROCEDURE CompOAG2 (t: Tree.tTree);
  1197.  VAR yyTempo: RECORD CASE : INTEGER OF
  1198.  END; END;
  1199.  BEGIN
  1200.   IF t = Tree.NoTree THEN RETURN; END;
  1201.   IF (t^.Kind = Tree.Class) THEN
  1202. (* line 805 "" *)
  1203.      WITH t^.Class DO
  1204. (* line 805 "" *)
  1205.       
  1206.     ActClass := t;
  1207.     ForallAttributes (t, CompOAG2);
  1208.     IF IsCyclic (OAG) THEN
  1209.       IF NOT IsElement (ORD ('L'), Options) THEN
  1210. Tree.WarningI (CycleInOAG, t^.Class.Pos, Errors.Ident, ADR (Name));
  1211.        WriteS (StdOutput, "Cyclic Attributes and Artificially Introduced Dependencies");
  1212.        WriteNl (StdOutput); WriteNl (StdOutput);
  1213.        MakeRelation (Part, InstCount, InstCount);
  1214.        MakeSet (Cyclics, InstCount);
  1215.        GetCyclics (OAG, Cyclics);
  1216.        Assign (Part, OAG);
  1217.        Difference (Part, DNC);
  1218.        WriteDependencies (t, Part, Cyclics);
  1219.        ReleaseRelation (Part);
  1220.        ReleaseSet (Cyclics);
  1221.       END;
  1222.        Success := FALSE;
  1223.     END;
  1224.       IF IsElement (ORD ('O'), Options) THEN
  1225.     WriteDependencies (t, OAG, MaxSet);
  1226.       END;
  1227. ;
  1228.       RETURN;
  1229.      END;
  1230.  
  1231.   END;
  1232.   IF (t^.Kind = Tree.Child) THEN
  1233. (* line 828 "" *)
  1234.    LOOP
  1235.      WITH t^.Child DO
  1236. (* line 829 "" *)
  1237.       IF NOT (Class # NoTree) THEN EXIT; END;
  1238. (* line 830 "" *)
  1239.       ChildsClass := Class;
  1240. (* line 831 "" *)
  1241.           FOR i := 1 TO ChildsClass^.Class.AttrCount DO
  1242.        FOR j := 1 TO ChildsClass^.Class.AttrCount DO
  1243.           IF IsRelated (i, j, ChildsClass^.Class.OAG) THEN
  1244.          Relations.Include (ActClass^.Class.OAG, ActClass^.Class.AttrCount + InstOffset + i, ActClass^.Class.AttrCount + InstOffset + j);
  1245.           END;
  1246.        END;
  1247.     END;
  1248. ;
  1249.       RETURN;
  1250.      END;
  1251.    END;
  1252.  
  1253.   END;
  1254.  END CompOAG2;
  1255.  
  1256. PROCEDURE CompOAG3a (t: Tree.tTree);
  1257.  VAR yyTempo: RECORD CASE : INTEGER OF
  1258.  END; END;
  1259.  BEGIN
  1260.   IF t = Tree.NoTree THEN RETURN; END;
  1261.   IF (t^.Kind = Tree.Class) THEN
  1262. (* line 912 "" *)
  1263.      WITH t^.Class DO
  1264. (* line 912 "" *)
  1265.       
  1266.  
  1267.     n := 0;                    (* strategy: as early as possible *)
  1268.     MakeSet (IsComputed, InstCount);
  1269.     MakeSet (IsComputable, InstCount);
  1270.     FOR i := 1 TO InstCount DO
  1271.        IF IsComputable3a (i, t) THEN Include (IsComputable, i);
  1272.  
  1273.        END;
  1274.     END;
  1275.  
  1276.     WHILE NOT Sets.IsEmpty (IsComputable) DO
  1277.        i2 := Minimum (IsComputable);
  1278.        j  := Maximum (IsComputable);
  1279.        LOOP
  1280.           IF IsElement (i2, IsComputable) THEN
  1281.          i := i2;
  1282.          IF NOT ({Inherited, Left} <= Instance^[i2].Properties) THEN EXIT; END;
  1283.           END;
  1284.           INC (i2);
  1285.           IF i2 > j THEN EXIT; END;
  1286.        END;
  1287.  
  1288.        WITH Instance^ [i] DO
  1289.           INC (n);
  1290.           Instance^[n].Order := i;
  1291.           Include (IsComputed, i);
  1292.           Exclude (IsComputable, i);
  1293.  
  1294.           INCL (Properties, First);
  1295.           Visit := Attribute^.Child.Partition;
  1296.           IF {Inherited, Left} <= Properties THEN
  1297.          FOR i2 := 1 TO AttrCount DO    (* complete visit parent *)
  1298.             WITH Instance^ [i2] DO
  1299.                IF NOT IsElement (i2, IsComputed) AND
  1300.               (Inherited IN Properties) AND
  1301.               (Attribute^.Child.Partition = Visit) THEN
  1302.               INC (n);
  1303.               Instance^[n].Order := i2;
  1304.               Include (IsComputed, i2);
  1305.               Exclude (IsComputable, i2);
  1306.  
  1307.                END;
  1308.             END;
  1309.          END;
  1310.           ELSIF {Synthesized, Right} <= Properties THEN
  1311.          IF Selector # NoTree THEN    (* complete visit child    *)
  1312.             ChildsClass := Selector^.Child.Class;
  1313.             FOR i2 := AttrCount + Selector^.Child.InstOffset + 1 TO
  1314.                AttrCount + Selector^.Child.InstOffset + ChildsClass^.Class.AttrCount DO
  1315.                WITH Instance^ [i2] DO
  1316.               IF NOT IsElement (i2, IsComputed) AND
  1317.                  (Synthesized IN Properties) AND
  1318.                  (Attribute^.Child.Partition = Visit) THEN
  1319.                  INC (n);
  1320.                  Instance^[n].Order := i2;
  1321.                  Include (IsComputed, i2);
  1322.                  Exclude (IsComputable, i2);
  1323.  
  1324.               END;
  1325.                END;
  1326.             END;
  1327.          END;
  1328.           ELSE
  1329.          FOR i2 := 1 TO InstCount DO    (* add group members *) (* optimize! *)
  1330.             IF NOT IsElement (i2, IsComputed) AND
  1331.                (Instance^[i2].Action = Action) THEN
  1332.                INC (n);
  1333.                Instance^[n].Order := i2;
  1334.                Include (IsComputed, i2);
  1335.                Exclude (IsComputable, i2);
  1336.  
  1337.             END;
  1338.          END;
  1339.           END;
  1340.  
  1341.           FOR i2 := 1 TO InstCount DO
  1342.           IF NOT IsElement (i2, IsComputed) AND
  1343.              NOT IsElement (i2, IsComputable) AND
  1344.              IsComputable3a (i2, t) THEN
  1345.              Include (IsComputable, i2);
  1346.  
  1347.           END;
  1348.           END;
  1349.        END;
  1350.     END;
  1351.     IF n # InstCount THEN
  1352. Tree.ErrorI (InternalErrorCompOAG, t^.Class.Pos, Errors.Ident, ADR (Name));
  1353.        Exclude (Options, ORD ('o'));
  1354.     END;
  1355.     ReleaseSet (IsComputed);
  1356.     ReleaseSet (IsComputable);
  1357.  
  1358.       IF IsElement (ORD ('G'), Options) THEN WriteOrderDecl (t); END;
  1359.       IF IsElement (ORD ('E'), Options) THEN WriteOrderEval (t); END;
  1360.       IF IsElement (ORD ('V'), Options) THEN WriteVisitSequence (t); END;
  1361. ;
  1362.       RETURN;
  1363.      END;
  1364.  
  1365.   END;
  1366.  END CompOAG3a;
  1367.  
  1368. PROCEDURE CompOAG3b (t: Tree.tTree);
  1369.  VAR yyTempo: RECORD CASE : INTEGER OF
  1370.  END; END;
  1371.  BEGIN
  1372.   IF t = Tree.NoTree THEN RETURN; END;
  1373.   IF (t^.Kind = Tree.Class) THEN
  1374. (* line 1013 "" *)
  1375.      WITH t^.Class DO
  1376. (* line 1013 "" *)
  1377.       
  1378.  
  1379.     MakeSet (IsComputed, InstCount);    (* strategy: as late as possible *)
  1380.  
  1381.     n := 0;                    (* set property First    *)
  1382.     REPEAT
  1383.        i := InstCount;
  1384.        LOOP
  1385.           WITH Instance^ [i] DO
  1386.          IF NOT IsElement (i, IsComputed) AND IsComputable3a (i, t) THEN
  1387.             INC (n);
  1388.             Include (IsComputed, i);
  1389.             INCL (Properties, First);
  1390.             Visit := Attribute^.Child.Partition;
  1391.             IF {Inherited, Left} <= Properties THEN
  1392.                FOR i2 := 1 TO AttrCount DO    (* complete visit parent *)
  1393.               WITH Instance^ [i2] DO
  1394.                  IF NOT IsElement (i2, IsComputed) AND
  1395.                 (Inherited IN Properties) AND
  1396.                 (Attribute^.Child.Partition = Visit) THEN
  1397.                 INC (n);
  1398.                 Include (IsComputed, i2);
  1399.                 FOR j := 1 TO InstCount DO
  1400.                    IF IsRelated (j, i2, OAG) THEN
  1401.                       Relations.Include (OAG, j, i);
  1402.                    END;
  1403.                 END;
  1404.                  END;
  1405.               END;
  1406.                END;
  1407.             ELSIF {Synthesized, Right} <= Properties THEN
  1408.                IF Selector # NoTree THEN    (* complete visit child    *)
  1409.               ChildsClass := Selector^.Child.Class;
  1410.               FOR i2 := AttrCount + Selector^.Child.InstOffset + 1 TO
  1411.                  AttrCount + Selector^.Child.InstOffset + ChildsClass^.Class.AttrCount DO
  1412.                  WITH Instance^ [i2] DO
  1413.                 IF NOT IsElement (i2, IsComputed) AND
  1414.                    (Synthesized IN Properties) AND
  1415.                    (Attribute^.Child.Partition = Visit) THEN
  1416.                    INC (n);
  1417.                    Include (IsComputed, i2);
  1418.                    FOR j := 1 TO InstCount DO
  1419.                       IF IsRelated (j, i2, OAG) THEN
  1420.                      Relations.Include (OAG, j, i);
  1421.                       END;
  1422.                    END;
  1423.                 END;
  1424.                  END;
  1425.               END;
  1426.                END;
  1427.             ELSE
  1428.                FOR i2 := 1 TO InstCount DO    (* add group members *) (* optimize! *)
  1429.               IF NOT IsElement (i2, IsComputed) AND
  1430.                  (Instance^[i2].Action = Action) THEN
  1431.                  INC (n);
  1432.                  Include (IsComputed, i2);
  1433.                  FOR j := 1 TO InstCount DO
  1434.                 IF IsRelated (j, i2, OAG) THEN
  1435.                    Relations.Include (OAG, j, i);
  1436.                 END;
  1437.                  END;
  1438.               END;
  1439.                END;
  1440.             END;
  1441.             EXIT;
  1442.          END;
  1443.           END;
  1444.           DEC (i);
  1445.        END;
  1446.     UNTIL n = InstCount;
  1447.  
  1448.     AssignEmpty (IsComputed);        (* determine order    *)
  1449.     MakeSet (IsComputable, InstCount);
  1450.     FOR i := 1 TO InstCount DO
  1451.        IF IsComputable3b (i, t) THEN
  1452.  
  1453.        Include (IsComputable, i); END;
  1454.     END;
  1455.  
  1456.     WHILE NOT Sets.IsEmpty (IsComputable) DO
  1457.        Prio := 0;
  1458.        i2 := Minimum (IsComputable);
  1459.        j  := Maximum (IsComputable);
  1460.        LOOP
  1461.           IF IsElement (i2, IsComputable) THEN
  1462.          WITH Instance^[i2] DO
  1463.             IF ((Test IN Properties) OR NOT (Read IN Properties)) AND (Prio < 1) THEN
  1464.                i := i2; Prio := 1;
  1465.             ELSIF ({Inherited, Left} <= Properties) AND (Prio < 2) THEN
  1466.                i := i2; Prio := 2;
  1467.             ELSIF (Output IN Properties) AND (Prio < 3) THEN
  1468.                i := i2; Prio := 3;
  1469.             ELSE
  1470.                i := i2; (* Prio := 4; *) EXIT;
  1471.             END;
  1472.          END;
  1473.           END;
  1474.           INC (i2);
  1475.           IF i2 > j THEN EXIT; END;
  1476.        END;
  1477.  
  1478.        WITH Instance^ [i] DO
  1479.           Include (IsComputed, i);
  1480.           Visit := Attribute^.Child.Partition;
  1481.           IF {Inherited, Left} <= Properties THEN
  1482.          FOR i2 := 1 TO AttrCount DO    (* complete visit parent *)
  1483.             WITH Instance^ [i2] DO
  1484.                IF NOT IsElement (i2, IsComputed) AND
  1485.               (Inherited IN Properties) AND
  1486.               (Attribute^.Child.Partition = Visit) THEN
  1487.  
  1488.               Instance^[n].Order := i2;
  1489.               DEC (n);
  1490.               Include (IsComputed, i2);
  1491.                END;
  1492.             END;
  1493.          END;
  1494.           ELSIF {Synthesized, Right} <= Properties THEN
  1495.          IF Selector # NoTree THEN    (* complete visit child    *)
  1496.             ChildsClass := Selector^.Child.Class;
  1497.             FOR i2 := AttrCount + Selector^.Child.InstOffset + 1 TO
  1498.                AttrCount + Selector^.Child.InstOffset + ChildsClass^.Class.AttrCount DO
  1499.                WITH Instance^ [i2] DO
  1500.               IF NOT IsElement (i2, IsComputed) AND
  1501.                  (Synthesized IN Properties) AND
  1502.                  (Attribute^.Child.Partition = Visit) THEN
  1503.  
  1504.                  Instance^[n].Order := i2;
  1505.                  DEC (n);
  1506.                  Include (IsComputed, i2);
  1507.               END;
  1508.                END;
  1509.             END;
  1510.          END;
  1511.           ELSE
  1512.          FOR i2 := 1 TO InstCount DO    (* add group members *) (* optimize! *)
  1513.             IF NOT IsElement (i2, IsComputed) AND
  1514.                (Instance^[i2].Action = Action) THEN
  1515.  
  1516.                Instance^[n].Order := i2;
  1517.                DEC (n);
  1518.                Include (IsComputed, i2);
  1519.             END;
  1520.          END;
  1521.           END;
  1522.  
  1523.  
  1524.           Instance^[n].Order := i;
  1525.           DEC (n);
  1526.           Exclude (IsComputable, i);
  1527.           FOR i2 := 1 TO InstCount DO
  1528.           IF (First IN Instance^[i2].Properties) AND
  1529.              NOT IsElement (i2, IsComputed) AND
  1530.              NOT IsElement (i2, IsComputable) AND
  1531.              IsComputable3b (i2, t) THEN
  1532.  
  1533.              Include (IsComputable, i2);
  1534.           END;
  1535.           END;
  1536.        END;
  1537.         END;
  1538.     ReleaseSet (IsComputed);
  1539.     ReleaseSet (IsComputable);
  1540.     IF n # 0 THEN
  1541.        CompOAG3a (t);
  1542.     ELSE
  1543.       IF IsElement (ORD ('G'), Options) THEN WriteOrderDecl (t); END;
  1544.       IF IsElement (ORD ('E'), Options) THEN WriteOrderEval (t); END;
  1545.       IF IsElement (ORD ('V'), Options) THEN WriteVisitSequence (t); END;
  1546.     END;
  1547. ;
  1548.       RETURN;
  1549.      END;
  1550.  
  1551.   END;
  1552.  END CompOAG3b;
  1553.  
  1554. PROCEDURE WriteOrderDecl (t: Tree.tTree);
  1555.  VAR yyTempo: RECORD CASE : INTEGER OF
  1556.  END; END;
  1557.  BEGIN
  1558.   IF t = Tree.NoTree THEN RETURN; END;
  1559.   IF (t^.Kind = Tree.Class) THEN
  1560. (* line 1188 "" *)
  1561.      WITH t^.Class DO
  1562. (* line 1188 "" *)
  1563.       
  1564.     WriteIdent    (StdOutput, Name);
  1565.         WriteS        (StdOutput, "    ");
  1566.         WriteClassProperties (StdOutput, Properties);
  1567.         WriteNl        (StdOutput);
  1568.     WriteNl        (StdOutput);
  1569.     FOR i := 1 TO InstCount DO
  1570.        WriteI (StdOutput, i, 2); WriteInstance (Instance^ [i]);
  1571.         END;
  1572.     WriteNl (StdOutput);
  1573. ;
  1574.       RETURN;
  1575.      END;
  1576.  
  1577.   END;
  1578.  END WriteOrderDecl;
  1579.  
  1580. PROCEDURE WriteOrderEval (t: Tree.tTree);
  1581.  VAR yyTempo: RECORD CASE : INTEGER OF
  1582.  END; END;
  1583.  BEGIN
  1584.   IF t = Tree.NoTree THEN RETURN; END;
  1585.   IF (t^.Kind = Tree.Class) THEN
  1586. (* line 1203 "" *)
  1587.      WITH t^.Class DO
  1588. (* line 1203 "" *)
  1589.       
  1590.     WriteIdent    (StdOutput, Name);
  1591.         WriteS        (StdOutput, "    ");
  1592.         WriteClassProperties (StdOutput, Properties);
  1593.         WriteNl        (StdOutput);
  1594.     WriteNl        (StdOutput);
  1595.     FOR i := 1 TO InstCount DO
  1596.        WriteI (StdOutput, Instance^ [i].Order, 2); WriteInstance (Instance^ [Instance^ [i].Order]);
  1597.         END;
  1598.     WriteNl (StdOutput);
  1599. ;
  1600.       RETURN;
  1601.      END;
  1602.  
  1603.   END;
  1604.  END WriteOrderEval;
  1605.  
  1606. PROCEDURE WriteVisitSequence (t: Tree.tTree);
  1607.  VAR yyTempo: RECORD CASE : INTEGER OF
  1608.  END; END;
  1609.  BEGIN
  1610.   IF t = Tree.NoTree THEN RETURN; END;
  1611.   IF (t^.Kind = Tree.Class) THEN
  1612. (* line 1218 "" *)
  1613.      WITH t^.Class DO
  1614. (* line 1218 "" *)
  1615.       
  1616.     WriteIdent    (StdOutput, Name);
  1617.         WriteS        (StdOutput, "    ");
  1618.         WriteClassProperties (StdOutput, Properties);
  1619.         WriteNl        (StdOutput);
  1620.     WriteNl        (StdOutput);
  1621.     FOR i := 1 TO InstCount DO
  1622.        AttrInstance := Instance^ [Instance^ [i].Order];
  1623.        WITH AttrInstance DO
  1624.           IF Inherited IN Properties THEN
  1625.          IF Left IN Properties THEN
  1626.             IF First IN Properties THEN
  1627.                WriteS  (StdOutput, "visit    parent ");
  1628.                WriteI  (StdOutput, Attribute^.Child.Partition, 0);
  1629.                WriteS  (StdOutput, ". time to compute");
  1630.                WriteNl (StdOutput);
  1631.             END;
  1632.             WriteS     (StdOutput, "    ");
  1633.             WriteName  (AttrInstance);
  1634.             WriteNl    (StdOutput);
  1635.          END;
  1636.          IF Right IN Properties THEN
  1637.             IF First IN Properties THEN
  1638.                WriteS  (StdOutput, "compute    ");
  1639.             ELSE
  1640.                WriteS  (StdOutput, "    ");
  1641.             END;
  1642.             WriteName  (AttrInstance);
  1643.             WriteNl    (StdOutput);
  1644.          END;
  1645.           END;
  1646.           IF Synthesized IN Properties THEN
  1647.          IF (Left IN Properties) AND NOT (Dummy IN Properties) THEN
  1648.             IF Test IN Properties THEN
  1649.                WriteS  (StdOutput, "check    condition ");
  1650.             ELSIF First IN Properties THEN
  1651.                WriteS  (StdOutput, "compute    ");
  1652.             ELSE
  1653.                WriteS  (StdOutput, "    ");
  1654.             END;
  1655.             WriteIdent (StdOutput, Attribute^.Child.Name);
  1656.             WriteNl    (StdOutput);
  1657.          END;
  1658.          IF Right IN Properties THEN
  1659.             IF {First, Dummy} <= Properties THEN
  1660.                WriteS     (StdOutput, "visit    ");
  1661.                WriteIdent (StdOutput, Selector^.Child.Name);
  1662.                WriteI     (StdOutput, Attribute^.Child.Partition, 2);
  1663.                WriteS     (StdOutput, ". time");
  1664.                WriteNl    (StdOutput);
  1665.             END;
  1666.             IF NOT (Dummy IN Properties) THEN
  1667.                IF First IN Properties THEN
  1668.               WriteS  (StdOutput, "visit    ");
  1669.               WriteIdent (StdOutput, Selector^.Child.Name);
  1670.               WriteI  (StdOutput, Attribute^.Child.Partition, 2);
  1671.               WriteS  (StdOutput, ". time to compute");
  1672.               WriteNl (StdOutput);
  1673.                END;
  1674.                WriteS     (StdOutput, "    ");
  1675.                WriteName  (AttrInstance);
  1676.                WriteNl    (StdOutput);
  1677.             END;
  1678.          END;
  1679.           END;
  1680.        END;
  1681.     END;
  1682.     WriteS  (StdOutput, "visit    parent");
  1683.     WriteNl (StdOutput);
  1684.     WriteNl (StdOutput);
  1685. ;
  1686.       RETURN;
  1687.      END;
  1688.  
  1689.   END;
  1690.  END WriteVisitSequence;
  1691.  
  1692. PROCEDURE CheckNormalForm (t: Tree.tTree);
  1693.  VAR yyTempo: RECORD CASE : INTEGER OF
  1694.  END; END;
  1695.  BEGIN
  1696.   IF t = Tree.NoTree THEN RETURN; END;
  1697.   IF (t^.Kind = Tree.Class) THEN
  1698. (* line 1293 "" *)
  1699.      WITH t^.Class DO
  1700. (* line 1293 "" *)
  1701.       
  1702.     FOR i := 1 TO InstCount DO
  1703.            IF NOT (Dummy IN Instance^ [i].Properties) THEN
  1704.           FOR j := 1 TO InstCount DO
  1705.          IF IsRelated (i, j, DP) THEN
  1706.             WITH Instance^ [j] DO
  1707.                IF ({Left, Synthesized} <= Properties) OR
  1708.               ({Right,  Inherited} <= Properties) THEN
  1709.               Success := FALSE; RETURN;
  1710.                END;
  1711.             END;
  1712.          END;
  1713.           END;
  1714.        END;
  1715.     END;
  1716. ;
  1717.       RETURN;
  1718.      END;
  1719.  
  1720.   END;
  1721.  END CheckNormalForm;
  1722.  
  1723. PROCEDURE CheckLAG (t: Tree.tTree);
  1724.  VAR yyTempo: RECORD CASE : INTEGER OF
  1725.  END; END;
  1726.  BEGIN
  1727.   IF t = Tree.NoTree THEN RETURN; END;
  1728.   IF (t^.Kind = Tree.Class) THEN
  1729. (* line 1313 "" *)
  1730.      WITH t^.Class DO
  1731. (* line 1313 "" *)
  1732.       
  1733.     FOR i := AttrCount + 1 TO InstCount DO
  1734.        FOR j := 1 TO AttrCount DO
  1735.           IF (Synthesized IN Instance^ [j].Properties) AND
  1736.          IsRelated (i, j, DP) THEN
  1737.          Success := FALSE; RETURN;
  1738.           END;
  1739.        END;
  1740.  
  1741.        WITH Instance^ [i] DO
  1742.           IF Selector # NoTree THEN
  1743.          ChildsClass := Selector^.Child.Class;
  1744.          FOR j := AttrCount + Selector^.Child.InstOffset + 1 TO
  1745.             AttrCount + Selector^.Child.InstOffset + ChildsClass^.Class.AttrCount DO
  1746.             IF (Synthesized IN Instance^ [j].Properties) AND
  1747.                IsRelated (i, j, DP) THEN
  1748.                Success := FALSE; RETURN;
  1749.             END;
  1750.          END;
  1751.  
  1752.          FOR j := AttrCount + Selector^.Child.InstOffset + ChildsClass^.Class.AttrCount + 1 TO InstCount DO
  1753.             IF IsRelated (i, j, DP) THEN
  1754.                Success := FALSE; RETURN;
  1755.             END;
  1756.          END;
  1757.           END;
  1758.        END;
  1759.     END;
  1760. ;
  1761.       RETURN;
  1762.      END;
  1763.  
  1764.   END;
  1765.  END CheckLAG;
  1766.  
  1767. PROCEDURE CheckSAG (t: Tree.tTree);
  1768.  VAR yyTempo: RECORD CASE : INTEGER OF
  1769.  END; END;
  1770.  BEGIN
  1771.   IF t = Tree.NoTree THEN RETURN; END;
  1772.   IF (t^.Kind = Tree.Class) THEN
  1773. (* line 1346 "" *)
  1774.      WITH t^.Class DO
  1775. (* line 1346 "" *)
  1776.       
  1777.     FOR i := AttrCount + 1 TO InstCount DO
  1778.        FOR j := 1 TO InstCount DO
  1779.           IF IsRelated (i, j, DP) THEN
  1780.          Success := FALSE; RETURN;
  1781.           END;
  1782.        END;
  1783.     END;
  1784. ;
  1785.       RETURN;
  1786.      END;
  1787.  
  1788.   END;
  1789.  END CheckSAG;
  1790.  
  1791. PROCEDURE InitWAG (t: Tree.tTree);
  1792.  VAR yyTempo: RECORD CASE : INTEGER OF
  1793.  END; END;
  1794.  BEGIN
  1795.   IF t = Tree.NoTree THEN RETURN; END;
  1796.   IF (t^.Kind = Tree.Class) THEN
  1797. (* line 1358 "" *)
  1798.    LOOP
  1799.      WITH t^.Class DO
  1800. (* line 1359 "" *)
  1801.       IF NOT (NOT IsElement (Index, Relevant)) THEN EXIT; END;
  1802. (* line 1360 "" *)
  1803.       Include (Relevant, Index);
  1804. (* line 1361 "" *)
  1805.       ForallAttributes (t, InitWAG);
  1806. (* line 1362 "" *)
  1807.       ForallClasses (Extensions, InitWAG);
  1808.       RETURN;
  1809.      END;
  1810.    END;
  1811.  
  1812.   END;
  1813.   IF (t^.Kind = Tree.Child) THEN
  1814. (* line 1364 "" *)
  1815.      WITH t^.Child DO
  1816. (* line 1365 "" *)
  1817.       InitWAG (Class);
  1818.       RETURN;
  1819.      END;
  1820.  
  1821.   END;
  1822.  END InitWAG;
  1823.  
  1824. PROCEDURE CheckWAG0 (t: Tree.tTree);
  1825.  VAR yyTempo: RECORD CASE : INTEGER OF
  1826.  END; END;
  1827.  BEGIN
  1828.   IF t = Tree.NoTree THEN RETURN; END;
  1829.   IF (t^.Kind = Tree.Class) THEN
  1830. (* line 1370 "" *)
  1831.      WITH t^.Class DO
  1832. (* line 1371 "" *)
  1833.       ForallAttributes (t, CheckWAG0);
  1834.       RETURN;
  1835.      END;
  1836.  
  1837.   END;
  1838.   IF (t^.Kind = Tree.Child) THEN
  1839. (* line 1373 "" *)
  1840.      WITH t^.Child DO
  1841. (* line 1374 "" *)
  1842.       CheckWAG1 (Class);
  1843.       RETURN;
  1844.      END;
  1845.  
  1846.   END;
  1847.  END CheckWAG0;
  1848.  
  1849. PROCEDURE CheckWAG1 (t: Tree.tTree);
  1850.  VAR yyTempo: RECORD CASE : INTEGER OF
  1851.  | 1: yyR1: RECORD
  1852.   A: tRelation;
  1853.   END;
  1854.  END; END;
  1855.  BEGIN
  1856.   IF t = Tree.NoTree THEN RETURN; END;
  1857. (* line 1379 "" *)
  1858.     WITH yyTempo.yyR1 DO
  1859.    LOOP
  1860.      WITH t^.Class DO
  1861. (* line 1380 "" *)
  1862.       ;
  1863. (* line 1381 "" *)
  1864.       IF NOT (NOT IsElement (Index, Cyclics)) THEN EXIT; END;
  1865. (* line 1382 "" *)
  1866.       Include (Cyclics, Index);
  1867. (* line 1383 "" *)
  1868.       ReleaseRelation (DNC);
  1869. (* line 1384 "" *)
  1870.       MakeRelation (A, InstCount, InstCount);
  1871. (* line 1385 "" *)
  1872.       Relations . Assign (A, DP);
  1873. (* line 1386 "" *)
  1874.       D := NIL;
  1875. (* line 1387 "" *)
  1876.       CheckWAG5 (t, A);
  1877. (* line 1388 "" *)
  1878.       ReleaseRelation (A);
  1879. (* line 1389 "" *)
  1880.       CheckWAG0 (t);
  1881. (* line 1390 "" *)
  1882.       ForallClasses (Extensions, CheckWAG1);
  1883.       RETURN;
  1884.      END;
  1885.    END;
  1886.     END;
  1887.  
  1888.  END CheckWAG1;
  1889.  
  1890. PROCEDURE CheckWAG2 (t: Tree.tTree);
  1891.  VAR yyTempo: RECORD CASE : INTEGER OF
  1892.  | 1: yyR1: RECORD
  1893.   A: tRelation;
  1894.   END;
  1895.  END; END;
  1896.  BEGIN
  1897.   IF t = Tree.NoTree THEN RETURN; END;
  1898. (* line 1395 "" *)
  1899.     WITH yyTempo.yyR1 DO
  1900.      WITH t^.Class DO
  1901. (* line 1396 "" *)
  1902.       ;
  1903. (* line 1397 "" *)
  1904.       MakeRelation (A, InstCount, InstCount);
  1905. (* line 1398 "" *)
  1906.       Relations . Assign (A, DP);
  1907. (* line 1399 "" *)
  1908.       ActClass := t;
  1909. (* line 1400 "" *)
  1910.       CheckWAG3 (Attributes, A);
  1911. (* line 1401 "" *)
  1912.       ReleaseRelation (A);
  1913.       RETURN;
  1914.      END;
  1915.     END;
  1916.  
  1917.  END CheckWAG2;
  1918.  
  1919. PROCEDURE CheckWAG3 (yyP2: Tree.tTree; yyP1: tRelation);
  1920.  VAR yyTempo: RECORD CASE : INTEGER OF
  1921.  END; END;
  1922.  BEGIN
  1923.   IF yyP2 = Tree.NoTree THEN RETURN; END;
  1924.   IF (yyP2^.Kind = Tree.Child) THEN
  1925. (* line 1406 "" *)
  1926.      WITH yyP2^.Child DO
  1927. (* line 1407 "" *)
  1928.       CheckWAG4 (Class, yyP1, Next, yyP2);
  1929.       RETURN;
  1930.      END;
  1931.  
  1932.   END;
  1933.   IF (yyP2^.Kind = Tree.NoAttribute) THEN
  1934. (* line 1409 "" *)
  1935.      WITH yyP2^.NoAttribute DO
  1936. (* line 1410 "" *)
  1937.       CheckWAG5 (ActClass, yyP1);
  1938.       RETURN;
  1939.      END;
  1940.  
  1941.   END;
  1942.   IF (yyP2^.Kind = Tree.Attribute) THEN
  1943. (* line 1412 "" *)
  1944.      WITH yyP2^.Attribute DO
  1945. (* line 1414 "" *)
  1946.       CheckWAG3 (Next, yyP1);
  1947.       RETURN;
  1948.      END;
  1949.  
  1950.   END;
  1951.   IF (yyP2^.Kind = Tree.ActionPart) THEN
  1952. (* line 1412 "" *)
  1953.      WITH yyP2^.ActionPart DO
  1954. (* line 1414 "" *)
  1955.       CheckWAG3 (Next, yyP1);
  1956.       RETURN;
  1957.      END;
  1958.  
  1959.   END;
  1960.  END CheckWAG3;
  1961.  
  1962. PROCEDURE CheckWAG4 (yyP6: Tree.tTree; yyP5: tRelation; yyP4: Tree.tTree; yyP3: Tree.tTree);
  1963.  VAR yyTempo: RECORD CASE : INTEGER OF
  1964.  | 1: yyR1: RECORD
  1965.   B: tRelation;
  1966.   ActD: tSetOfRelPtr;
  1967.   END;
  1968.  END; END;
  1969.  BEGIN
  1970.   IF yyP6 = Tree.NoTree THEN RETURN; END;
  1971.   IF yyP4 = Tree.NoTree THEN RETURN; END;
  1972.   IF yyP3 = Tree.NoTree THEN RETURN; END;
  1973. (* line 1419 "" *)
  1974.     WITH yyTempo.yyR1 DO
  1975.      WITH yyP6^.Class DO
  1976. (* line 1420 "" *)
  1977.       ;
  1978. (* line 1421 "" *)
  1979.       MakeRelation (B, ActClass ^ . Class . InstCount, ActClass ^ . Class . InstCount);
  1980. (* line 1422 "" *)
  1981.       ActD := D;
  1982. (* line 1423 "" *)
  1983.           WHILE ActD # NIL DO
  1984.        Relations.Assign (B, yyP5);
  1985.        FOR i := 2 TO yyP3^.Child.Class^.Class.AttrCount DO
  1986.           FOR j := 2 TO yyP3^.Child.Class^.Class.AttrCount DO
  1987.          IF IsRelated (i, j, ActD^.Relation) THEN
  1988.             Relations.Include (B, ActClass^.Class.AttrCount + yyP3^.Child.InstOffset + i, ActClass^.Class.AttrCount + yyP3^.Child.InstOffset + j);
  1989.          END;
  1990.           END;
  1991.        END;
  1992.        CheckWAG3 (yyP4, B);
  1993.        ActD := ActD^.Next;
  1994.     END;
  1995.     ReleaseRelation (B);
  1996. ;
  1997.       RETURN;
  1998.      END;
  1999.     END;
  2000.  
  2001.  END CheckWAG4;
  2002.  
  2003. PROCEDURE CheckWAG5 (t: Tree.tTree; yyP7: tRelation);
  2004. (* line 1439 "" *)
  2005.  TYPE tSetOfRelPtrPtr = POINTER TO tSetOfRelPtr; 
  2006.  VAR yyTempo: RECORD CASE : INTEGER OF
  2007.  | 1: yyR1: RECORD
  2008.   B: tRelation;
  2009.   ActD: tSetOfRelPtr;
  2010.   LastNext: tSetOfRelPtrPtr;
  2011.   END;
  2012.  END; END;
  2013.  BEGIN
  2014.   IF t = Tree.NoTree THEN RETURN; END;
  2015. (* line 1441 "" *)
  2016.     WITH yyTempo.yyR1 DO
  2017.      WITH t^.Class DO
  2018. (* line 1442 "" *)
  2019.       ;
  2020. (* line 1443 "" *)
  2021.       
  2022.     IF Reporting THEN
  2023. Tree.ErrorI (CycleInWAG, t^.Class.Pos, Errors.Ident, ADR (Name));
  2024.        WriteS (StdOutput, "Attribute Dependencies WAG");
  2025.        WriteNl (StdOutput); WriteNl (StdOutput);
  2026.        WriteDependencies (t, yyP7, MaxSet);
  2027.        WriteS (StdOutput, "Cyclic Attributes");
  2028.        WriteNl (StdOutput); WriteNl (StdOutput);
  2029.        MakeSet (Cyclics, InstCount);
  2030.        GetCyclics (yyP7, Cyclics);
  2031.        WriteCyclics (ActClass, Cyclics); WriteNl (StdOutput);
  2032.        ReleaseSet (Cyclics);
  2033.     ELSE
  2034.        IF (Referenced IN Properties) OR (BaseClass^.Kind = Tree.NoClass) THEN
  2035.           Closure (yyP7);
  2036.           IF HasReflexive (yyP7) THEN Include (HasCycle, Index); END;
  2037.           MakeRelation (B, AttrCount, AttrCount);
  2038.           FOR i := 2 TO AttrCount DO        (* project on left-hand side *)
  2039.          FOR j := 2 TO AttrCount DO
  2040.             IF IsRelated (i, j, yyP7) THEN
  2041.                Relations.Include (B, i, j);
  2042.             END;
  2043.          END;
  2044.           END;
  2045.           IF Relations.IsEmpty (B) THEN
  2046.          ReleaseRelation (B);
  2047.          RETURN;
  2048.           END;
  2049.           ActD := D;    (* is B already covered by (subset of) some x in D? *)
  2050.           WHILE ActD # NIL DO
  2051.          IF Relations.IsSubset (B, ActD^.Relation) THEN
  2052.             ReleaseRelation (B);
  2053.             RETURN;
  2054.          END;
  2055.          ActD := ActD^.Next;
  2056.           END;
  2057.           ActD := D;        (* remove all x in D covered by (subset of) B *)
  2058.           LastNext := ADR (D);
  2059.           WHILE ActD # NIL DO
  2060.          IF Relations.IsSubset (ActD^.Relation, B) THEN
  2061.             ActD := ActD^.Next;
  2062.             Free (TSIZE (tSetOfRel), LastNext^);
  2063.             LastNext^ := ActD;
  2064.          ELSE
  2065.             LastNext := ADR (ActD^.Next);
  2066.             ActD := ActD^.Next;
  2067.          END;
  2068.           END;
  2069.           ActD := Alloc (TSIZE (tSetOfRel));    (* include B in D *)
  2070.           ActD^.Next := D;
  2071.           ActD^.Relation := B;
  2072.           D := ActD;
  2073.           FOR UserIndex := Minimum (Users) TO Maximum (Users) DO
  2074.          IF IsElement (UserIndex, Users) AND IsElement (UserIndex, Relevant) THEN
  2075.             Enqueue (UserIndex);
  2076.          END;
  2077.           END;
  2078.        END;
  2079.        IF BaseClass^.Kind # Tree.NoClass THEN
  2080.           CheckWAG5 (BaseClass, yyP7);
  2081.        END;
  2082.     END;
  2083. ;
  2084.       RETURN;
  2085.      END;
  2086.     END;
  2087.  
  2088.  END CheckWAG5;
  2089.  
  2090. PROCEDURE BeginOrder;
  2091.  BEGIN
  2092.  END BeginOrder;
  2093.  
  2094. PROCEDURE CloseOrder;
  2095.  BEGIN
  2096.  END CloseOrder;
  2097.  
  2098. PROCEDURE yyExit;
  2099.  BEGIN
  2100.   IO.CloseIO; System.Exit (1);
  2101.  END yyExit;
  2102.  
  2103. BEGIN
  2104.  yyf    := IO.StdOutput;
  2105.  Exit    := yyExit;
  2106.  BeginOrder;
  2107. END Order.
  2108.